home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / netprog.zip / NETPROG.TAR / lib / idpopen.c < prev    next >
C/C++ Source or Header  |  1989-12-17  |  2KB  |  82 lines

  1. /*
  2.  * Establish an IDP socket and optionally call connect() to set up
  3.  * the server's address for future I/O.
  4.  */
  5.  
  6. #include    "netdefs.h"
  7.  
  8. #include    <netns/ns.h>
  9.  
  10. /*
  11.  * The following globals are available to the caller, if desired.
  12.  */
  13.  
  14. struct sockaddr_ns    idp_srv_addr;    /* server's XNS socket addr */
  15. struct sockaddr_ns    idp_cli_addr;    /* client's XNS socket addr */
  16.  
  17. int            /* return socket descriptor if OK, else -1 on error */
  18. idp_open(host, service, port, dontconn)
  19. char    *host;        /* name of other system to communicate with */
  20.                    /* must be acceptable to ns_addr(3N) */
  21.                    /* <netid><separator><hostid><separator><port> */
  22. char    *service;    /* name of service being requested */
  23.                 /* not currently used */
  24. int    port;        /* if < 0, bind a local reserved port (TODO) */
  25.             /* if > 0, it's the port# of server */
  26. int    dontconn;    /* if == 0, call connect(), else don't */
  27. {
  28.     int        fd;
  29.     struct ns_addr    ns_addr();    /* BSD library routine */
  30.  
  31.     /*
  32.      * Create an IDP socket.
  33.      */
  34.  
  35.     if ( (fd = socket(AF_NS, SOCK_DGRAM, 0)) < 0) {
  36.         err_ret("idp_open: can't create IDP datagram socket");
  37.         return(-1);
  38.     }
  39.  
  40.     /*
  41.      * Bind any local address for us.
  42.      */
  43.  
  44.     bzero((char *) &idp_cli_addr, sizeof(idp_cli_addr));
  45.     idp_cli_addr.sns_family = AF_NS;
  46.     if (bind(fd, (struct sockaddr *) &idp_cli_addr,
  47.                         sizeof(idp_cli_addr)) < 0) {
  48.         err_ret("idp_open: bind error");
  49.         close(fd);
  50.         return(-1);
  51.     }
  52.  
  53.     /*
  54.      * Set up the server's address.
  55.      */
  56.  
  57.     bzero((char *) &idp_srv_addr, sizeof(idp_srv_addr));
  58.     idp_srv_addr.sns_family = AF_NS;
  59.     idp_srv_addr.sns_addr   = ns_addr(host);
  60.                     /* stores net-ID, host-ID and port */
  61.     if (port > 0)
  62.         idp_srv_addr.sns_addr.x_port = htons(port);
  63.     else if (port < 0)
  64.         err_quit("idp_open: reserved ports not implemeneted yet");
  65.  
  66.     /*
  67.      * Call connect, if desired.  This is used by most caller's,
  68.      * as the peer shouldn't change.
  69.      * By calling connect, the caller can call send() and recv().
  70.      */
  71.  
  72.     if (dontconn == 0) {
  73.         if (connect(fd, (struct sockaddr *) &idp_srv_addr,
  74.                         sizeof(idp_srv_addr)) < 0) {
  75.             err_ret("idp_open: connect error");
  76.             return(-1);
  77.         }
  78.     }
  79.  
  80.     return(fd);
  81. }
  82.